package miniBanco.Handler;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import miniBanco.Core.LocalRequestEnum;
import miniBanco.Core.UsuarioBO;
import miniBanco.Dto.UsuarioDTO;
import miniBanco.Exceptions.HandledException;
import miniBanco.Gui.UsuariosForm;
import miniBanco.Gui.UsuariosGridAbm;
import miniBanco.Mapper.UsuarioDAO;
import basics.DBManager;

public class HandlerUsuarios extends abstractHandler {
	
	private static HandlerUsuarios instance = null;
	private miniBanco.Gui.UsuariosGridAbm usuariosGrid;
	private UsuarioDAO usuarioDao;
	private UsuarioBO usuarioBO;
	ArrayList<UsuarioDTO> usuariosList;
	private HandlerUsuarios() {
		usuarioDao = new UsuarioDAO();
		usuarioBO = new UsuarioBO();
		usuarioBO.setDao(usuarioDao);	
	}

    public static HandlerUsuarios getInstance() {
      if(instance == null) {
         instance = new HandlerUsuarios();
      }
      return instance;
    }

	public void OnABMCloseWindow(boolean refresh) {
		jPopUpFrame.setVisible(false);
		if(refresh)
		{
			onRefresh();
		}
	}

	public void onItemClick() {
		try
		{
			usuariosList = usuarioBO.getAllUsuarios();
			usuariosGrid = new UsuariosGridAbm(usuariosList);
	
			usuariosGrid.getGrid().getTopBar().buttonAlta.addActionListener(new ActionListener() {	
				@Override
				public void actionPerformed(ActionEvent arg0) {
					OnOpenEditable(LocalRequestEnum.Insertar,0);
				}
			});
			usuariosGrid.getGrid().getTopBar().buttonModificacion.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
					
					if(usuariosGrid.getGrid().getTable().getSelectedRow() == -1){
						JOptionPane.showMessageDialog(null, "Debe seleccionar al menos un registro");
						return;
					}
					int row = usuariosGrid.getGrid().getTable().getSelectedRow();
					OnOpenEditable(LocalRequestEnum.Modificar,row);
				}
			});
			
			usuariosGrid.getGrid().getTopBar().buttonBaja.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					if(usuariosGrid.getGrid().getTable().getSelectedRow() == -1)
					{
						JOptionPane.showMessageDialog(null, "Debe seleccionar al menos un registro");
						return;
					}
					int row = usuariosGrid.getGrid().getTable().getSelectedRow();
					OnOpenEditable(LocalRequestEnum.Borrar,row);
				}
			});
			
       	}
		catch(HandledException ex)
		{
			JOptionPane.showMessageDialog(null, ex.getMessage());	
		}
		catch(Exception ex)
		{
			DBManager.Error(ex);
		}
       	openPopup(usuariosGrid);
	}

	public void onRefresh() {
		usuariosList = usuarioBO.getAllUsuarios();
		usuariosGrid.Refresh(usuariosList);
		usuariosGrid.updateUI();
	}

	public void OnOpenEditable(final LocalRequestEnum pLocalRequest,int row) {
		try 
    	{
			final UsuariosForm frm = new UsuariosForm();
	   		if(pLocalRequest != LocalRequestEnum.Insertar)
	   		{
	   			UsuarioDTO usuario = usuariosList.get(row);
	   			frm.setFormValues(usuario);
	   		}
			openPopup(frm);
			frm.buttonBar.buttonOK.addActionListener(
	                new ActionListener() {
	                    public void actionPerformed(ActionEvent e) {
	                    	switch(pLocalRequest)
	            			{
	            				case Insertar: 
	            					usuarioBO.insertarUsuario(frm.getFormValues());
	            				;break;
	            				case Modificar: 
	            					usuarioBO.updateUsuario(frm.getFormValues());
	            				;break;
	            				case Borrar: 
	            					usuarioBO.deleteUsuarioByUserName(frm.getFormValues().getUsername());
	            				;break;
	            			}
	                    	OnABMCloseWindow(true);
	                    }
	                }
	            );
			
			frm.buttonBar.buttonCancel.addActionListener(
	                new ActionListener() {
	                    public void actionPerformed(ActionEvent e) {
	                    	OnABMCloseWindow(false);
	                    }
	                }
	            );
		} 
    	catch (Exception ex) 
    	{
    		DBManager.Error(ex);
    		JOptionPane.showMessageDialog(null, ex.getMessage());
    	}		
	}	
}
